package com.eptok.yspay.opensdkjava;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.eptok.yspay.opensdkjava.common.Constants;
import com.eptok.yspay.opensdkjava.orderpay.ScanCodePayApi;
import com.eptok.yspay.opensdkjava.pojo.vo.OnlineReqDataVo;
import com.eptok.yspay.opensdkjava.util.DateUtil;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author YIFan
 * @Date 2022/4/6 11:06
 * @Version 1.0
 * @DESC //TODO
 */
public class weixinpay {

    public static void main(String[] args) throws Exception {
        OnlineReqDataVo vo = new OnlineReqDataVo();
        vo.setSignType(Constants.YSF_SIGN_TYPE_SM2);
        vo.setReturnUrl("https://v0710.top");
        vo.setTranType("1");
        vo.setReqUrl("https://qrcode.ysepay.com/gateway.do");
        vo.setPrivateKeyFilePath("D:\\AProject\\payDoc\\qzd.sm2");
        vo.setPrivateKeyPassword("qzd2022");
        vo.setYsPublicKeyFilePath("D:\\AProject\\payDoc\\sm2businessgate.cer");
        vo.setPartnerId("826521779410035");
        vo.setNotifyUrl("https://v0710.top");

        vo.setParamData(bizContent());

        ScanCodePayApi.weixinpay(vo);
    }
    public static Map<String, Object> bizContent(){
        Map<String, Object> bizContent = new HashMap<>();
        //商户生成的订单号，生成规则前8位必须为交易日期，如20180525，范围跨度支持包含当天在内的前后一天，且只能由大小写英文字母、数字、下划线及横杠组成
//        bizContent.put("out_trade_no", "201805256843192280647118");
        bizContent.put("out_trade_no", DateUtil.getDateNowYmd()+ DateUtil.getRandom(6));
        //商户日期(该参数做交易与查询时需要一致) 该日期需在当日的前后一天时间范围之内
        bizContent.put("shopdate",  DateUtil.getDateNowYmd());
        //商品的标题/交易标题/订单标题/订单关键字等。该参数最长为250个汉字
        bizContent.put("subject", "微信公众号，小程序支付接口测试");
        //该笔订单的资金总额，单位为RMB-Yuan。取值范围为[0.01，100000000.00]，精确到小数点后两位。Number(10,2)指10位长度，2位精度
        bizContent.put("total_amount", "2.99");
        //支持币种：CNY(人民币)、HKD(港币)、USD(美元)、EUR(欧元)、JPY(日元)
        //注:不填默认是CNY(人民币)，如是非跨境商户，币种不能填HKD(港币)、USD(美元)、EUR(欧元)、JPY(日元)中的任意一种外币币种
        bizContent.put("currency", "CNY");
        //收款方银盛支付用户号
        bizContent.put("seller_id", "826521779410035");
        //收款方银盛支付客户名
        bizContent.put("seller_name", "武汉球之道科技有限公司（收银机）");
        //设置未付款交易的超时时间，一旦超时，该笔交易就会自动被关闭。
        //(需申请业务权限，权限未开通情况下该参数不生效，默认未付款交易的超时时间为7d)取值范围：1m～15d。m-分钟，h-小时，d-天。该参数数值不接受小数点，如1.5h，可转换为90m。
        //注意：设置了未付款交易超时时间的情况下，若我司在限定时间内没有收到成功支付通知，则会关闭交易，关闭后该笔交易若付款方支付成功的情况下，会自动原路退款至付款方
        bizContent.put("timeout_express","1h");
        //业务扩展参数，一个json字符串,order_mode订单模式，暂时可选的值为:00 代表购物车模式;seller_list参与分账的收款方信息数组，每个元素包含seller_id收款方银盛支付用户号。
        //实时分账业务，order_mode和seller_list均不能为空，order_mode的值必须为00
//        bizContent.put("extend_params","{\"cartTYpe\": \"00\",\"order_mode\": \"01\",\"seller_list\": [{\"seller_id\": \"123\"},{\"seller_id\": \"456\"}]}");
        //公用回传参数
        bizContent.put("extra_common_param", "extra_common_param");
        //业务代码
        bizContent.put("business_code", "01000010");
        //微信用户所关注商家公众号的openid
        bizContent.put("sub_openid", "oc0KJ5Kcr5lhbKgmkqXPENrGzsdw");
        //小程序支付，值为1，表示小程序支付；不传或值为2，表示公众账号内支付
        bizContent.put("is_minipg", "1");
        // 测试wx6ceaca9158cf9f7d
        //当发起公众号支付时，值是微信公众平台基本配置中的AppID(应用ID)；当发起小程序支付时，值是对应小程序的AppID  wxde20e559cc8c9cce
        bizContent.put("appid", "wxde20e559cc8c9cce");


        //=================二级商户信息, Json格式=================
        //如果有值则二级商户信息都不能为空，如果没值则都不能有值
//        JSONObject subMerchantInfoJson = new JSONObject();
//        subMerchantInfoJson.put("merName","");//二级商户名称,支持25个中文
//        subMerchantInfoJson.put("merShortName","");//二级商户简称,支持25个中文
//        subMerchantInfoJson.put("merAddr","");//二级商户地址,支持100个中文
//        subMerchantInfoJson.put("telephone","");//固定电话/手机号码二选一
//        subMerchantInfoJson.put("merNo","");//二级商户编号
//        subMerchantInfoJson.put("category","");//类目，按附件内容输入类目编号
//        subMerchantInfoJson.put("mrchntCertId","");//身份证号,只支持身份证格式(DES加密，密钥为商户号前8位，不足8位在商户号前补空格)
        //二级商户json格式
//        bizContent.put("sub_merchant",subMerchantInfoJson);


//        //=================收货人信息json格式(可空)=================
//        JSONObject consigneeInfoJson = new JSONObject();
//        subMerchantInfoJson.put("consigneeName","");//收货人姓名
//        subMerchantInfoJson.put("consigneeAddr","");//收货地址
//        subMerchantInfoJson.put("transportationInfo","");//物流配送信息（物流名称+订单号）
//        subMerchantInfoJson.put("commodityName","");//商品名称
//        subMerchantInfoJson.put("commodityNumber","");//商品数量
//        //收货人信息json格式
//        bizContent.put("consignee_info",consigneeInfoJson);


        //订单所属省编号（省市编号必须同时为空或者同时非空、并且需要符合层级关系）（特殊可空）
//        bizContent.put("province",null);
        //订单所属市编号（省市编号必须同时为空或者同时非空、并且需要符合层级关系）（特殊可空）
//        bizContent.put("city",null);
        //该笔订单的商户自主营销优惠金额，单位为RMB-Yuan。取值范围为[0.01，100000000.00]，精确到小数点后两位。Number(10,2)指10位长度，2位精度
//        bizContent.put("mer_amount","0.01");
        //是否限制信用卡。值为1表示禁用信用卡，0或为空表示不限制
        bizContent.put("limit_credit_pay","0");
        //是否允许多次支付,Y：允许;N：不允许（参数为空或者Y时，默认该笔订单交易状态非成功状态时，支持选择其他支付方式继续付款，适用于收银台模式。 当为N时表示该笔订单交易状态为失败状态时，不支持选择其他支付方式继续付款，收银台模式下建议该参数为空）
        bizContent.put("allow_repeat_pay","N");
        //失败通知地址（交易状态为失败时，银盛支付服务器主动通知商户网站里指定的页面http路径，支持多个url进行异步通知，多个url用分隔符“,”分开，格式如：url1,url2,url3）注：只有不允许重复支付的交易才会通知
        bizContent.put("fail_notify_url","http://127.0.0.1");


        //================要上传的商品信息json格式(可空)=================
        //注意：如果detail已经不为空，那么detail里面wxpay_goods_detail不可空，goods_id/quantity/price不可空
        JSONObject detail = new JSONObject();
        detail.put("cost_price",0.23);//订单原价，整数不超过14位，小数不超过2位，单位元
        detail.put("receipt_id","Ys001001");//商品小票，长度不能超过32位
        //================商品列表goods_detail(如果detail已经填写，goods_detail不可空)=================
        JSONArray goodsDetail = new JSONArray();
        JSONObject goods = new JSONObject();
        goods.put("goods_id","Shouji_abcef_001-001");//商品编码由半角的大小写字母，数字，下划线，中划线中的一种或者几种组成，长度不能超过32位
        goods.put("wxpay_goods_id","1001");//微信支付定义的统一商品编号，长度不能超过32
        goods.put("goods_name","手机");//商品的实际名称，长度不能超过256
        goods.put("quantity",1000);//数量，只能是正整数
        goods.put("price",100.20);//商品单价，单位元，整数部分不能超过12位，小数不能超过2位
        goodsDetail.add(goods);
        //商品列表goods_detail设置到商品信息detail中
        detail.put("goods_detail",goodsDetail);
        //商品信息json格式
        bizContent.put("detail",detail);


        bizContent.put("submer_ip","112.112.112.112");//子商户ip

        return bizContent;
    }
}
